{#

This file is part of the Sonata package.

(c) Thomas Rabaix <thomas.rabaix@sonata-project.org>

For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.

#}


{#

This code manage the many-to-[one|many] association field popup

#}

{% autoescape false %}

<script>
    <!-- edit many association -->

    {#
      handle link click in a list :
        - if the parent has an objectId defined then the related input get updated
        - if the parent has NO object then an ajax request is made to refresh the popup
    #}
    var field_dialog_form_list_link_{{ field_element.id }} = function(event) {
        initialize_popup_{{ field_element.id }}();
        
        event.preventDefault();
        event.stopPropagation();
        
        var element = jQuery(this).parents('#field_dialog_{{ field_element.id }} td.sonata-ba-list-field');

        // the user does does click on a row column
        if (element.length == 0) {
            // make a recursive call (ie: reset the filter)
            jQuery.ajax({
                type: 'GET',
                url: jQuery(this).attr('href'),
                success: function(html) {
                   field_dialog_{{ field_element.id }}.html(html);
                }
            });

            return;
        }

        jQuery('#{{ field_element.id }}').val(element.attr('objectId'));
        jQuery('#{{ field_element.id }}').trigger('change');

        field_dialog_{{ field_element.id }}.dialog('close');
    }


    // handle the add link
    var field_dialog_form_list_{{ field_element.id }} = function(event) {

        initialize_popup_{{ field_element.id }}();

        event.preventDefault();
        event.stopPropagation();
        
        var a = jQuery(this);

        field_dialog_{{ field_element.id }}.html('');

        // retrieve the form element from the related admin generator
        jQuery.ajax({
            url: a.attr('href'),
            success: function(html) {

                // populate the popup container
                field_dialog_{{ field_element.id }}.html(html);

                // capture the submit event to make an ajax call, ie : POST data to the
                // related create admin
                jQuery('a', field_dialog_{{ field_element.id }}).live('click', field_dialog_form_list_link_{{ field_element.id }});
                jQuery('form', field_dialog_{{ field_element.id }}).live('submit', function(event) {
                    event.preventDefault();

                    var form = jQuery(this);

                    jQuery(form).ajaxSubmit({
                        type: form.attr('method'),
                        url: form.attr('action'),
                        data: {_xml_http_request: true},
                        success: function(html) {
                           field_dialog_{{ field_element.id }}.html(html);
                        }
                    });
                });

                // open the dialog in modal mode
                field_dialog_{{ field_element.id }}.dialog({
                    height: 'auto',
                    width: 980,
                    modal: true,
                    resizable: false,
                    title: '{{ field_description.associationadmin.label }}',
                    close: function(event, ui) {
                        // make sure we have a clean state
                        jQuery('a', field_dialog_{{ field_element.id }}).die('click');
                        jQuery('form', field_dialog_{{ field_element.id }}).die('submit');
                    }
                });
            }
        });
    };

    // handle the add link
    var field_dialog_form_add_{{ field_element.id }} = function(event) {
        initialize_popup_{{ field_element.id }}();

        event.preventDefault();
        event.stopPropagation();

        var a = jQuery(this);

        field_dialog_{{ field_element.id }}.html('');

        Admin.log('[{{ field_element.id }}|field_dialog_form_add] add link action');
        // retrieve the form element from the related admin generator
        jQuery.ajax({
            url: a.attr('href'),
            success: function(html) {

                Admin.log('[{{ field_element.id }}|field_dialog_form_add] ajax success', field_dialog_{{ field_element.id }});
                
                // populate the popup container
                field_dialog_{{ field_element.id }}.html(html);

                // capture the submit event to make an ajax call, ie : POST data to the
                // related create admin
                jQuery('a', field_dialog_{{ field_element.id }}).live('click', field_dialog_form_action_{{ field_element.id }});
                jQuery('form', field_dialog_{{ field_element.id }}).live('submit', field_dialog_form_action_{{ field_element.id }});

                // open the dialog in modal mode
                field_dialog_{{ field_element.id }}.dialog({
                    height: 'auto',
                    width: 650,
                    modal: true,
                    resizable: false,
                    title: '{{ field_description.associationadmin.label }}',
                    close: function(event, ui) {
                        Admin.log('[{{ field_element.id }}|field_dialog_form_add] dialog closed - removing `live` events');
                        // make sure we have a clean state
                        jQuery('a', field_dialog_{{ field_element.id }}).die('click');
                        jQuery('form', field_dialog_{{ field_element.id }}).die('submit');
                    }
                });
            }
        });
    };
    
    // handle the post data
    var field_dialog_form_action_{{ field_element.id }} = function(event) {

        event.preventDefault();
        event.stopPropagation();
        
        Admin.log('[{{ field_element.id }}|field_dialog_form_action] action catch', this);
        initialize_popup_{{ field_element.id }}();

        var element = jQuery(this);

        if (this.nodeName == 'FORM') {
            var url  = element.attr('action');
            var type = element.attr('method');
        } else if (this.nodeName == 'A') {
            var url  = element.attr('href');
            var type = 'GET';
        } else {
            alert('unexpected element : @' + this.nodeName + '@');
            return;
        }

        if (element.hasClass('sonata-ba-action')) {
            Admin.log('[{{ field_element.id }}|field_dialog_form_action] reserved action stop catch all events');
            return;
        }

        var data = {
            _xml_http_request: true
        }

        var form = jQuery(this);

        Admin.log('[{{ field_element.id }}|field_dialog_form_action] execute ajax call');
        
        // the ajax post
        jQuery(form).ajaxSubmit({
            url: url,
            type: type,
            data: data,
            success: function(data) {

                Admin.log('[{{ field_element.id }}|field_dialog_form_action] ajax success');
                if (typeof data == 'string') {
                    field_dialog_{{ field_element.id }}.html(data);
                    return;
                };

                // if the crud action return ok, then the element has been added
                // so the widget container must be refresh with the last option available
                if (data.result == 'ok') {
                    field_dialog_{{ field_element.id }}.dialog('close');

                    {% if field_description.options.edit == 'list' %}
                        {#
                           in this case we update the hidden input, and call the change event to
                           retrieve the post information
                        #}
                        jQuery('#{{ field_element.id }}').val(data.objectId);
                        jQuery('#{{ field_element.id }}').change();

                    {% else %}

                        // reload the form element
                        jQuery('#field_widget_{{ field_element.id }}').closest('form').ajaxSubmit({
                            url: '{{ url('sonata_admin_retrieve_form_element', {
                                'elementId': field_element.id,
                                'objectId':  admin.root.subject.id,
                                'uniqid':    admin.root.uniqid,
                                'code':      admin.root.code
                            }) }}',
                            data: {_xml_http_request: true },
                            type: 'POST',
                            success: function(html) {
                                jQuery('#field_widget_{{ field_element.id }}').html(html);
                            }
                        });

                    {% endif %}

                    return;
                }

                // otherwise, display form error
                field_dialog_{{ field_element.id }}.html(html);

                Admin.add_pretty_errors(field_dialog_{{ field_element.id }});

                // reattach the event
                jQuery('form', field_dialog_{{ field_element.id }}).submit(field_dialog_form_action_{{ field_element.id }});
            }
        });

        return false;
    }

    var field_dialog_{{ field_element.id }} = false;

    function initialize_popup_{{ field_element.id }}() {
        // initialize component
        if (!field_dialog_{{ field_element.id }}) {
            field_dialog_{{ field_element.id }} = jQuery("#field_dialog_{{ field_element.id }}");

            // move the dialog as a child of the root element, nested form breaks html ...
            jQuery(document).append(field_dialog_{{ field_element.id }});

            Admin.log('[{{ field_element.id }}|field_dialog] move dialog container as a document child');
        }
    }

    {#
        This code is used to defined the "add" popup
    #}
    // this function initialize the popup
    // this can be only done this way has popup can be cascaded
    function start_field_dialog_form_add_{{ field_element.id }}(event) {
        event.preventDefault();

        // remove the html event a
        var a = jQuery(event.target).closest('a');
        a.attr('onclick', '');

        initialize_popup_{{ field_element.id }}();

       // add the jQuery event to the a element
        a.click(field_dialog_form_add_{{ field_element.id }});

        // trigger the event
        a.trigger('click');

        return false;
    }

    Admin.add_pretty_errors(field_dialog_{{ field_element.id }});


    {% if field_description.options.edit == 'list' %}
        {#
            This code is used to defined the "list" popup
        #}
        // this function initialize the popup
        // this can be only done this way has popup can be cascaded
        function start_field_dialog_form_list_{{ field_element.id }}(event) {
            event.preventDefault();

            // remove the html event a
            var a = jQuery(event.target).closest('a');
            a.attr('onclick', '');

            initialize_popup_{{ field_element.id }}();

            // add the jQuery event to the a element
            a.click(field_dialog_form_list_{{ field_element.id }});

            // trigger the event
            a.trigger('click');

            return false;
        }

        {#
          attach onchange event on the input
        #}

        // update the 
        jQuery('#{{ field_element.id }}').live('change', function(event) {
            jQuery.ajax({
                type: 'GET',
                url: '{{ url('sonata_admin_short_object_information', {
                    'objectId': 'OBJECT_ID',
                    'uniqid': field_description.associationadmin.uniqid,
                    'code': field_description.associationadmin.code
                })}}'.replace('OBJECT_ID', jQuery(this).val()),
                success: function(html) {
                    jQuery('#field_widget_{{ field_element.id }}').html(html);
                }
            });
        });

    {% endif %}

    <!-- / edit many association -->
</script>

{% endautoescape %}